package com.hutao.medical.common.util;

import java.util.Arrays;

import org.apache.commons.lang3.StringUtils;

public class DiseaseValidateUtil {
	// 主要诊断开头格式
	public static final String MAIN_DISEASE_START_STR = "ABCDEFGHIJKLMNOPQRSTUZ";

	// 其他诊断开头格式
	public static final String OTHER_DISEASE_START_STR = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
	//12岁以下儿童不能以有男性女性生殖疾病和分娩相关的编码为主要诊断编码
	public static final String[] CHILD_NOT_CONTAIN_DIAG_CODE = { "P00", "P01", "P02", "P03", "P04", "P05", "P06", "P07",
			"P08", "P09", "P10", "P11", "P12", "P13", "P14", "P15", "P16", "P17", "P18", "P19", "P20", "P21", "P22",
			"P23", "P24", "P25", "P26", "P27", "P28", "P29", "P30", "P31", "P32", "P33", "P34", "P35", "P36", "P37",
			"P38", "P39", "P40", "P41", "P42", "P43", "P44", "P46", "P47", "P48", "P49", "P50", "P51", "P52", "P53",
			"P54", "P55", "P56", "P57", "P58", "P59", "P60", "P61", "P62", "P63", "P64", "P65", "P66", "P67", "P68",
			"P69", "P70", "P71", "P72", "P73", "P74", "P75", "P76", "P77", "P78", "P79", "P80", "P81", "P82", "P83",
			"P84", "P85", "P86", "P87", "P88", "P89", "P90", "P91", "P92", "P93", "P94", "P95", "P96", "O00", "O01",
			"O02", "O03", "O04", "O05", "O06", "O07", "O08", "O09", "O10", "O11", "O12", "O13", "O14", "O15", "O16",
			"O17", "O18", "O19", "O20", "O21", "O22", "O23", "O24", "O25", "O26", "O27", "O28", "O29", "O30", "O31",
			"O32", "O33", "O34", "O35", "O36", "O37", "O38", "O39", "O40", "O41", "O42", "O43", "O44", "O45", "O46",
			"O47", "O48", "O49", "O50", "O51", "O52", "O53", "O54", "O55", "O56", "O57", "O58", "O59", "O60", "O61",
			"O62", "O63", "O64", "O65", "O66", "O67", "O68", "O69", "O70", "O71", "O72", "O73", "O74", "O75", "O76",
			"O77", "O78", "O79", "O80", "O81", "O82", "O83", "O84", "O85", "O86", "O87", "O88", "O89", "O90", "O91",
			"O92", "O93", "O94", "O95", "O96", "O97", "O98", "O99", "C50", "C51", "C52", "C53", "C54", "C55", "C56",
			"C57", "C58", "C59", "C60", "C61", "C62", "C63", "D24", "D25", "D26", "D27", "D28", "D29" };

	//当性别为男性时疾病主要诊断编码不能包含一下开头的疾病名称
	public static final String[] MAN_NOT_CONTAIN_DISEASE_CODE = { "N80", "N81", "N82", "N83", "N84", "N85", "N86",
			"N87", "N88", "N89", "N90", "N91", "N92", "N93", "N94", "N95", "N96", "N97", "N98", "C51", "C52", "C53",
			"C54", "C55", "C55", "C56", "C57", "C58", "N70", "N71", "N72", "N73", "N74", "N75", "N76", "N77", "D06",
			"D24", "D25", "D27", "C50", "N60", "N61", "N62", "N63", "N64", "O00", "O01", "O02", "O03", "O04", "O05",
			"O06", "O07", "O08", "O09", "O10", "O11", "O12", "O13", "O14", "O15", "O16", "O17", "O18", "O19", "O20",
			"O21", "O22", "O23", "O24", "O25", "O26", "O27", "O28", "O29", "O30", "O31", "O32", "O33", "O34", "O35",
			"O36", "O37", "O38", "O39", "O40", "O41", "O42", "O43", "O44", "O45", "O46", "O47", "O48", "O49", "O50",
			"O51", "O52", "O53", "O54", "O55", "O56", "O57", "O58", "O59", "O60", "O61", "O62", "O63", "O64", "O65",
			"O66", "O67", "O68", "O69", "O70", "O71", "O72", "O73", "O74", "O75", "O76", "O77", "O78", "O79", "O80",
			"O81", "O82", "O83", "O84", "O85", "O86", "O87", "O88", "O89", "O90", "O91", "O92", "O93", "O94", "O95",
			"O96", "O97", "O98", "O99" };


	// 其它诊断编码不能使用以下编码
	public static final String[] MAN_OTHER_DIAG_NOT_FIVE_CODE = { "B37.3", "C79.6", "D07.0", "D07.1", "D07.2", "D07.3", "E89.4",
			"F52.5", "I86.3", "L29.2", "M80.0", "M80.1", "M83.0", "N99.2", "N99.3", "P54.6", "S31.4", "S37.4", "S37.5",
			"S37.6", "T19.2", "T19.3", "T83.3", "Z01.4", "Z30.1", "Z30.3", "Z30.5", "Z31.1", "Z31.2", "Z87.5",
			"Z97.5" };

	// 其它诊断编码不能使用以下编码
	public static final String[] MAN_OTHER_DIAG_NOT_THREE_CODE = { "A34", "C51", "C52", "C53", "C54", "C55", "C56", "C57", "C58",
			"D06", "D25", "D26", "D27", "D28", "D39", "E28", "F53", "N70", "N71", "N72", "N73", "N74", "N75", "N76",
			"N77", "N78", "N79", "N80", "N81", "N82", "N83", "N84", "N85", "N86", "N87", "N88", "N89", "N90", "N91",
			"N92", "N93", "N94", "N95", "N96", "N97", "N98", "Q50", "Q51", "Q52", "R87", "Z32", "Z33", "Z34", "Z35",
			"Z36", "Z37", "Z39", "O00", "O01", "O02", "O03", "O04", "O05", "O06", "O07", "O08", "O09", "O10", "O11",
			"O12", "O13", "O14", "O15", "O16", "O17", "O18", "O19", "O20", "O21", "O22", "O23", "O24", "O25", "O26",
			"O27", "O28", "O29", "O30", "O31", "O32", "O33", "O34", "O35", "O36", "O37", "O38", "O39", "O40", "O41",
			"O42", "O43", "O44", "O45", "O46", "O47", "O48", "O49", "O50", "O51", "O52", "O53", "O54", "O55", "O56",
			"O57", "O58", "O59", "O60", "O61", "O62", "O63", "O64", "O65", "O66", "O67", "O68", "O69", "O70", "O71",
			"O72", "O73", "O74", "O75", "O76", "O77", "O78", "O79", "O80", "O81", "O82", "O83", "O84", "O85", "O86",
			"O87", "O88", "O89", "O90", "O91", "O92", "O93", "O94", "O95", "O96", "O97", "O98", "O99" };

	// 性别为男性时门诊诊断不能为一下编码开头的编码
	public static final String[] CLINIC_DIAGNOSIS_MAN_NOT_CODE_FIVE = { "B37.3", "C79.6", "D07.0", "D07.1", "D07.2",
			"D07.3", "E89.4", "F52.5", "I86.3", "M80.0", "M80.1", "M81.0", "M81.1", "M83.0", "N99.2", "N99.3", "S31.4",
			"L29.2", "P54.6", "S37.4", "S37.6", "T19.2", "T19.3", "T83.3", "Z01.4", "Z12.4", "Z30.1", "Z30.3", "Z30.5",
			"Z31.1", "Z31.2", "Z87.5", "Z97.5"

	};

	// 性别为男性时门诊诊断不能为一下编码开头的编码
	public static final String[] CLINIC_DIAGNOSIS_MAN_NOT_CODE_THREE = { "A34", "C51", "C52", "C53", "C54", "C55",
			"C55", "C56", "C57", "C58", "D06", "D06", "D25", "D26", "D27", "D28", "F53", "N70", "N71", "N72", "N73",
			"N74", "N75", "N76", "N77", "N78", "N79", "N80", "N81", "N82", "N83", "N84", "N85", "N86", "N87", "N88",
			"N89", "N90", "N91", "N92", "N93", "N94", "N95", "N96", "N97", "N98", "O00", "O01", "O02", "O03", "O04",
			"O05", "O06", "O07", "O08", "O09", "O10", "O11", "O12", "O13", "O14", "O15", "O16", "O17", "O18", "O19",
			"O20", "O21", "O22", "O23", "O24", "O25", "O26", "O27", "O28", "O29", "O30", "O31", "O32", "O33", "O34",
			"O35", "O36", "O37", "O38", "O39", "O40", "O41", "O42", "O43", "O44", "O45", "O46", "O47", "O48", "O49",
			"O50", "O51", "O52", "O53", "O54", "O55", "O56", "O57", "O58", "O59", "O60", "O61", "O62", "O63", "O64",
			"O65", "O66", "O67", "O68", "O69", "O70", "O71", "O72", "O73", "O74", "O75", "O76", "O77", "O78", "O79",
			"O80", "O81", "O82", "O83", "O84", "O85", "O86", "O87", "O88", "O89", "O90", "O91", "O92", "O93", "O94",
			"O95", "O96", "O97", "O98", "O99", "Q50", "Q51", "Q52", "R87", "Z32", "Z33", "Z34", "Z35", "Z36", "Z37",
			"Z39" };

	// ----------------------------------------------------------
	// 性别为女性时主要诊断编码不能为
	public static String[] FEMAL_MAIN_DISEASE_CODE_THREE = { "N40", "N41", "N42", "N43", "N44", "N45", "N46", "N46",
			"N47", "N48", "N49", "N50", "N51", "C60", "C61", "C62", "C63", "K40", "K40", "C60", "C61", "C62", "C63",
			"D29", "D40", "E29", "Q53", "Q54", "Q55", "R86", "D40" };
	// 性别为女性时主要诊断编码不能为
	public static String[] FEMAL_MAIN_DISEASE_CODE_FIVE = { "B26.0", "D07.4", "D07.5", "D07.5", "D07.6", "D17.6",
			"E89.5", "F52.4", "I86.1", "L29.1", "S31.2", "S31.3", "Z12.5", "D29.1" };

	// 性别为女性时其他诊断不为一下开头的编码
	public static String[] FEMAL_OTHER_DISEASE_CODE_THREE = { "C60", "C61", "C62", "C63", "D29", "D40", "E29", "N40",
			"N41", "N42", "N43", "N44", "N45", "N46", "N47", "N48", "N49", "N50", "N51", "Q53", "Q54", "Q55", "R86" };

	// 性别为女性时其他诊断不为一下开头的编码
	public static String[] FEMAL_OTHER_DISEASE_CODE_FIVE = { "B26.0", "D07.4", "D07.5", "D07.6", "D17.6", "E89.5",
			"F52.4", "I86.1", "L29.1", "S31.2", "S31.3", "Z12.5" };

	// 性别为女性时门诊诊断不应为以下开头的编码
	public static String[] FEMAL_CLINIC_DISEASE_CODE_THREE = { "C60", "C61", "C62", "C63", "D29", "N40", "N41", "N42",
			"N43", "N44", "N45", "N46", "N47", "N48", "N49", "N50", "N51", "D29", "D40", "E29", "Q53", "Q54", "Q55",
			"R86" };

	// 性别为女性时门诊诊断不应为以下开头的编码
	public static String[] FEMAL_CLINIC_DISEASE_CODE_FIVE = { "B26.0", "D07.4", "D07.5", "D07.6", "D17.6", "E89.5",
			"F52.4", "I86.1", "L29.1", "S31.2", "S31.3", "Z12.5" };

	// 以下编码不能作为主要诊断编码
	public static String[] MAIN_DISEASE_NOT_CODE = { "B95", "B96", "B97", "O06", "Z91", "Z92", "Z93", "Z94", "Z95",
			"Z96", "Z97", "Z98", "Z99", "T32", "Z80", "Z81", "Z82", "Z83", "Z84", "M99", "Z37", "Z38", "Z85", "Z86",
			"Z87", "Z88", "Z89", "Z90" };

	// 以下编码隐含医疗风险
	public static String[] MAIN_DISEASE_HASE_RAISE = { "T80", "T81", "T82", "T83", "T84", "T85", "T86", "T87", "T88" };

	
	/**
	 *
	 * 
	 * @param age
	 * @param diagTypeCode
	 * @param diseaseDiagCode
	 * @return
	 */
	public static boolean validateChildDisease(String diseaseDiagCode, String[] diseaseCodeArray) {
		if(StringUtils.isEmpty(diseaseDiagCode)){
			return true;
		}
		String code = diseaseDiagCode.substring(0, 3);
		if (Arrays.asList(diseaseCodeArray).contains(code)) {
			return false;
		}

		return true;
	}
	
	
	/**
	 * 当性别为男性时主要诊断本能包含女性生殖器、乳方、围产相关的疾病编码
	 * @param diagCode
	 * @param diseaseCodeArray
	 * @return
	 */
	public static boolean validateManMainDiag(String diagCode){
		if(StringUtils.isEmpty(diagCode)){
			return true;
		}
		String code = diagCode.substring(0, 3);
		if (Arrays.asList(MAN_NOT_CONTAIN_DISEASE_CODE).contains(code)) {
			return false;
		}
		return true;
	}
	
	
	//女性主要诊断不编码以男性生殖器、前列腺等疾病编码
	public static boolean validateFemalMainDiag(String diagCode){
		if(StringUtils.isEmpty(diagCode)){
			return true;
		}
		String codeThree = diagCode.substring(0, 3);
		String codeFive = diagCode.substring(0, 5);
		if (Arrays.asList(FEMAL_MAIN_DISEASE_CODE_THREE).contains(codeThree)) {
			return false;
		}
		
		if (Arrays.asList(FEMAL_MAIN_DISEASE_CODE_FIVE).contains(codeFive)) {
			return false;
		}
		return true;
	}
	
	
	/**
	 * 主要诊断以B95-B97、O06、Z80-Z99、T32、M99开头为主要诊断编码
	 *
	 * @param diagCode
	 * @param diseaseCodeArray
	 * @return
	 */
	public static boolean validateMainDiag(String diagCode){
		if(StringUtils.isEmpty(diagCode)){
			return true;
		}
		String code = diagCode.substring(0, 3);
		if (Arrays.asList(MAIN_DISEASE_NOT_CODE).contains(code)) {
			return false;
		}
		return true;
	}
	
	
	/**
	 *主要诊断以T80-T88开头为主要诊断编码可能隐含医疗风险
	 * @param diagCode
	 * @param diseaseCodeArray
	 * @return
	 */
	public static boolean validateRaiseMainDiag(String diagCode){
		if(StringUtils.isEmpty(diagCode)){
			return true;
		}
		String code = diagCode.substring(0, 3);
		if (Arrays.asList(MAIN_DISEASE_HASE_RAISE).contains(code)) {
			return false;
		}
		return true;
	}
	
	
	
	/**
	 * 当性别为男性时其他诊断不能以女性疾病作为其他诊断编码
	 * @param diagCode
	 * @return
	 */
	public  static boolean validateManOtherDiagCode(String diagCode){
		if(StringUtils.isEmpty(diagCode)){
			return true;
		}
		String code = diagCode.substring(0, 3);
		String five = diagCode.substring(0, 5);
		if (Arrays.asList(MAN_OTHER_DIAG_NOT_THREE_CODE).contains(code)) {
			return false;
		}
		if (Arrays.asList(MAN_OTHER_DIAG_NOT_FIVE_CODE).contains(five)) {
			return false;
		}
		return true;
		
	}
	
	
	/**
	 * 当性别为男性时其他诊断不能以女性疾病作为其他诊断编码
	 * @param diagCode
	 * @return
	 */
	public  static boolean validateFemalOtherDiagCode(String diagCode){
		if(StringUtils.isEmpty(diagCode)){
			return true;
		}
		String code = diagCode.substring(0, 3);
		String five = diagCode.substring(0, 5);
		if (Arrays.asList(FEMAL_OTHER_DISEASE_CODE_THREE).contains(code)) {
			return false;
		}
		if (Arrays.asList(FEMAL_OTHER_DISEASE_CODE_FIVE).contains(five)) {
			return false;
		}
		return true;
		
	}
	
	
	/**
	 * 性别为男性时门诊诊断不能以女性疾病编码作为门诊诊断编码
	 * @param diagCode
	 * @return
	 */
	public static boolean validateManClinicDiagCode(String diagCode){
		if(StringUtils.isEmpty(diagCode)){
			return true;
		}
		String code = diagCode.substring(0, 3);
		String five = diagCode.substring(0, 5);
		if (Arrays.asList(CLINIC_DIAGNOSIS_MAN_NOT_CODE_THREE).contains(code)) {
			return false;
		}
		if (Arrays.asList(CLINIC_DIAGNOSIS_MAN_NOT_CODE_FIVE).contains(five)) {
			return false;
		}
		return true;
	}
	
	
	
	
	/**
	 * 性别为女性时门诊诊断不能以男性疾病编码作为门诊诊断编码
	 * @param diagCode
	 * @return
	 */
	public static boolean validateFemalClinicDiagCode(String diagCode){
		if(StringUtils.isEmpty(diagCode)){
			return true;
		}
		String code = diagCode.substring(0, 3);
		String five = diagCode.substring(0, 5);
		if (Arrays.asList(FEMAL_CLINIC_DISEASE_CODE_THREE).contains(code)) {
			return false;
		}
		if (Arrays.asList(FEMAL_CLINIC_DISEASE_CODE_FIVE).contains(five)) {
			return false;
		}
		return true;
	}

}
